{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Supervised Learning (3) - Neural Networks, Deep Learning\n",
    "## Machine Learning Lectures by the ESA Data Analytics Team for Operations (DATO)\n",
    "### [José Martínez Heras](https://www.linkedin.com/in/josemartinezheras/)\n",
    "\n",
    "## Resouces\n",
    "This notebook is best followed when watched along to its corresponding [deep learning using convolutional neural networks for hand written recognition **video**](https://dlmultimedia.esa.int/download/public/videos/2048/03/003/4803_003_AR_EN.mp4)\n",
    "\n",
    "The tutorial about convolutional neural networks can be found in the [2018-MachineLearning-Lectures-ESA **GitHub**](https://github.com/jmartinezheras/2018-MachineLearning-Lectures-ESA)\n",
    "\n",
    "## Goal of today's project\n",
    "Classify hand written numbers. The goal is to help post offices to automatically route the mail by reading the hand written zip code. \n",
    "\n",
    "### Inspired by\n",
    "* https://github.com/wxs/keras-mnist-tutorial/blob/master/MNIST%20in%20Keras.ipynb\n",
    "* https://github.com/keras-team/keras/blob/master/examples/mnist_cnn.py"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T09:36:44.331239Z",
     "start_time": "2018-03-22T09:36:44.328199Z"
    }
   },
   "source": [
    "## Import libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:06.837368Z",
     "start_time": "2018-03-22T11:14:03.766149Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\jamheras\\AppData\\Local\\Continuum\\anaconda3\\lib\\site-packages\\h5py\\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n",
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "np.random.seed(42)\n",
    "\n",
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt\n",
    "plt.rcParams['figure.figsize'] = (7,4.5) # Make the figures a bit bigger\n",
    "\n",
    "from keras.datasets import mnist\n",
    "from keras.models import Sequential\n",
    "from keras.layers.core import Dense, Dropout, Activation, Flatten\n",
    "from keras.layers import Convolution2D, MaxPooling2D\n",
    "from keras import backend as K\n",
    "from keras.utils import np_utils\n",
    "\n",
    "from sklearn.dummy import DummyClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import accuracy_score, log_loss\n",
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data\n",
    "The MNIST database (Modified National Institute of Standards and Technology database) is a large database of handwritten digits that is commonly used for training various image processing systems. The database is also widely used for training and testing in the field of machine learning. It was created by \"re-mixing\" the samples from NIST's original datasets. The creators felt that since NIST's training dataset was taken from American Census Bureau employees, while the testing dataset was taken from American high school students, it was not well-suited for machine learning experiments. Furthermore, the black and white images from NIST were normalized to fit into a 28x28 pixel bounding box and anti-aliased, which introduced grayscale levels.\n",
    "\n",
    "The MNIST database contains 60,000 training images and 10,000 testing images. Half of the training set and half of the test set were taken from NIST's training dataset, while the other half of the training set and the other half of the test set were taken from NIST's testing dataset. \n",
    "\n",
    "Wikipedia contributors, \"MNIST database,\" Wikipedia, The Free Encyclopedia, https://en.wikipedia.org/w/index.php?title=MNIST_database&oldid=829836442 (accessed March 22, 2018)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:07.345048Z",
     "start_time": "2018-03-22T11:14:06.839006Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz\n",
      "11493376/11490434 [==============================] - 7s 1us/step\n",
      "X_train original shape (60000, 28, 28)\n",
      "y_train original shape (60000,)\n"
     ]
    }
   ],
   "source": [
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "\n",
    "print(\"X_train original shape\", X_train.shape)\n",
    "print(\"y_train original shape\", y_train.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T09:46:26.531308Z",
     "start_time": "2018-03-22T09:46:26.528836Z"
    }
   },
   "source": [
    "### Exploratory Data Analysis (EDA)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.326374Z",
     "start_time": "2018-03-22T11:14:07.346596Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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8/O23HLLCo2kuNL7fV933XVeX7geC/OZq9vjjz/uta+88sq8t03/rh944AGvb5VVVinuwNBsd955p9c+9dRTk3revHleX7h2zXbbbZfUc+fO9frOOOOMvMdMP054jDvuuKOJEaNYws+b6fWuwlwsXLiw4Mft1atXUj/yyCNe3zfffJPUvXv39vrSWQhzgTjMnz/fa7/yyisVGgnKaeedd/baja2B0aVLl6ROrz8h+WulSf4ajKFnn302qceOHVvQOGPDFRgAAAAAACB6nMAAAAAAAADRq7kpJCuttJLXvvTSS5M6vMR24403Tur0pZ2h9O0k6bHHHvPa6a2PXn31Va/viiuuaGLEiMnEiROT+l//+pfX19j2lOnLfSWpf//+SR1e7tu1a9ek7tOnj9fX2HQktsds2nfffVfpIZTEcccdl7cvfUkxqtO4ceOS+sgjj/T6Gpv6mH5tYcu9yli8eLHXHj9+fFKH/92mt+ZOTxeUpHPPPddrp7ekC7fPPeCAA5L60UcfzTu2vn375u1Dad1zzz1e++9//3uLHmettdby2unPn+E2qultw1F90q8PkvTuu+8WfN/06044jZT3hrj93//9n9fee++98962TZs2Sb3qqqu2+JgLFixI6g022MDrS09ZDoVj22yzzVo8htbiCgwAAAAAABA9TmAAAAAAAIDoNXkCw8xuMLOPzOzV1PdWMrPHzGxG7t8VG3sM1B5ygSzkAiEygSzkAlnIBUJkAlnIRX0rZA2MEZL+Kim9P+FgSU845y4xs8G59m8z7ltx6fk6O+64o9fXoUOHpJ48ebLXd/311yf1oEGDvL70mhehcC7R8OHDCx9sdRmhKs7FDyZNmuS109sZpeeISZKZJfXuu+/u9YVbrD799NNJfdFFF3l9xx57bFJ37tzZ69too42SOtwCKVyT46WXXkrqTTbZRJEYoTLnIv3f7kcffVSsh41KuL1aWrgFV4RGqAZeK0rppptuSuo5c+bkvV241s7hhx9esjGVwQjVQC5uvfVWr51+fQ+l/1sNt9Ls2LFj3vuFt21s3Ytu3bol9RFHHJH3dhEboRrIxahRowq+bc+ePZM6nFP+xz/+0WuH616kvfHGGwUfs8qMUA1koimrrbaa106vhzRkyJBG75vuX2GFFby+k046qbVDi9UI1UAull7a/1O8sf/GiyW9BfOnn35a8P3S7y+StMwyyxRtTM3V5BUYzrmxkj4Jvj1A0g+fuG6SlH/FEdQkcoEs5AIhMoEs5AJZyAVCZAJZyEV9a+kaGKs45+ZIUu7fLvluaGYDzWyCmU2YO3duCw+HKlFQLshE3SEXCPEegiy8ViALuUCI9xBk4bWiTpR8G1Xn3HBJwyWpb9++Fd0HsrFLNJdffvm8feH2VwceeKDXDi/1R+MqnYnp06cn9dChQ72+9JaFnTp18vrS25+Gl+aG04rS26im69b48ssvvfawYcOS+vbbby/KMSqppbl48MEHkzr8GVWrDz/80GvPnDkz721XX331Eo+msir9elEK8+bN89o33HBDUofvJ+nLgc8555zSDqxKVDoT6d/DxRdf7PWlpxqecMIJXl96OmFjn0dCv//97wu+bXrr9nCKYq2rdC7Sws+N6enEu+yyi9e39tprJ3WXLnn/Dm9S+L6BBjHlojnSWys3NYUEzVOtmWipO+64w2unX4+a87n5ggsuKNqYWqulf3l/aGZdJSn3b21OPEdzkQtkIRcIkQlkIRfIQi4QIhPIQi7qREtPYIyW9MP/gj5C0n3FGQ6qHLlAFnKBEJlAFnKBLOQCITKBLOSiThSyjepISc9JWtfMZpvZMZIukbSzmc2QtHOujTpCLpCFXCBEJpCFXCALuUCITCALuahvTa6B4Zw7KE9XvyKPpaLOP/98rz1x4sSkHjNmjNf3+OOPe+1wPmM9qKZcfP3111779NNPT+r0+gmSv7XuzTff7PX17ds3qWNYa+G9996r9BCWUIlcTJs2LW/fT37yk1IdtqTSGZX8uc3rrLOO15fObIyq6bWiVMI1TPbbb7+C73vyyScndbgVeDWrplyE837T6160bdvW69t1112TOtwCc9lll817jK+++sprp7dKfffdd70+5/47ZTtcF2XAgAF5j1ENqikXjQm3xCzHGgbPPvtsyY9RCbWSidb4/vvvvTZr75GLULil9yWX/PfczVtvveX1ffvttwU95sYbb+y127Rp08LRFR//BQAAAAAAgOhxAgMAAAAAAESv5NuoVotwG8zrrrsuqTfZZBOv77jjjvPaO+ywQ1KnpxlI0oknnpjU6e3VUD4vvfSS1w6njaTdd99/1/vZbrvtSjYmlMdmm21W6SF4FixYkNQPP/yw15e+/C99+XgovGQ8vc0m4hT+ridPnpz3tv36+Ve/nnrqqSUZE/KbP3++17766qu9dvq9PD1lRJLuvffego7x5ptveu1DDjnEa6ensYZ+8YtfJPUZZ5xR0PFQHdLb4ErS559/7rXT04fCz5RTpkzJ+7hbbrllZo3qEE4Z4e+J2hFOMb3llluSOlyyoDHjxo3z2oVmJNzSOz31ZI899vD6GpsGWW5cgQEAAAAAAKLHCQwAAAAAABA9TmAAAAAAAIDosQZGHmuttVZSjxgxwus76qijvHZ6vlK6lvz5i4cffrjX17Vr19YOEwX49a9/7bXTc0jDdS5iWveiqW2z0s8D2T755JMW3e+VV17x2unfxRNPPOH1zZ49O6m/+eYbr++2227L+zjhXMItttgiqZdZZhmvb/HixUkdrrODOKXXQhg8eHCjt916662T+qabbvL6ll9++eIODE0K/zueN29e3tuGaxZ89NFHSX3jjTd6faNHj07qV1991etbtGiR107PXw7nMh966KFJHa7fhTh98cUXSf3aa695feltehtbo0vy30Ma20oz/HyZ/hy71FJLNXoMAKWVXq9mr7328vree++9so5lm2228doDBw4s6/FbiiswAAAAAABA9DiBAQAAAAAAoscJDAAAAAAAED3WwCjAPvvs47XXXnttrz1o0KCkDufHn3XWWUk9a9asvH3dunVr9TjR4IEHHvDa4XoG6fnE4dyzmDS17/fGG29czuFEK72WRPgz+uUvf5nUf/jDHwp+zMmTJ3vt9HojSy/tv2wut9xySd27d2+v7+ijj/bam266aVJvv/32Xt8qq6yS1OHrwZdffpnU6623XmNDR4WEe7nvt99+Bd/3xz/+cVKnc4DKaNu2rdfu3Lmz1547d25Sr7nmml5f+BqUz2qrrea1O3bs6LXnzJmT1J06dfL69txzz4KOgfL69ttvk/rll1/2+tKvB+nfreS/h4VrV2y11VZe++GHH07q9Loaoe+++85r33333Ul96qmnen1h3gFUTkvXt2tq3bx8wr+Z0uvw7LHHHi0aSzlwBQYAAAAAAIgeJzAAAAAAAED0mELSAhtuuKHXHjVqVFLff//9Xl96y9Vrr73W65sxY0ZSP/bYY8UcYl1LX24vLbklXpcuXZL6f//3f8sypny+/vprrz1kyJC8t91xxx299iWXXFKKIVWdq6++Oql79Ojh9T377LMteszu3bt77QEDBiT1+uuv7/X97Gc/a9ExQsOHD0/q9CXqkj/FAHH64x//6LULvXxTanqbVZTXCius4LXTW+JKUv/+/ZM63Ko5vQV7+nVDko488sikXmmllby+Aw880GunpxmEfYhD+NkiPb1j3333zXu/888/32vvsMMOSZ3eUllaMl/pzwHhVrxp4XvImWeemdTh+9vee+/ttcNtvFF5zZkeMHbsWK990kknlWRMaLn035FPP/2013fLLbck9W677eb1tWvXrkXHu/766732lVde2aLHiQlXYAAAAAAAgOhxAgMAAAAAAESPExgAAAAAACB6rIFRBOn5socddpjXd+yxxyb14sWLvb70PLVwDlS4xSKKJz2/M9yyrBzS615cdNFFXt+ll16a1OFWmunteiWpffv2JRhddfvtb39b6SG0WLgFc1pztuRE+UyaNCmpH3300YLvF66NsO666xZtTCi+LbbYwmuH6wu0RDhPfcyYMV47PcedNXDikN4mVVpyLYv0+3coPZf95JNP9vrSnyHDbIXbGE6ZMiWpw+1Pf/Ob32TeTpJGjx6d1IcccojXt9NOO+V9nBVXXFH59OnTJ28fiitc86Kx7ZrTW+ZK0uuvv57U4RpeqLxw7bZzzjmn6McI19djDQwAAAAAAIAy4AQGAAAAAACIHlNIWmDy5Mle+5///GdSjx8/3usLp42kpS/l2nbbbYs0OjRlr732Kuvx0peZS9LQoUOTOr0Fr+SPLbwMEPUr3OYOcdhll12S+tNPP817u3AKwogRI0o1JFSJcLvvxi4RZxvVyvnuu++S+txzz/X6hg0b5rV/9KMfJfXFF1/s9R100EFJHW7Tm/7cGE4vefnll712r169kvpvf/ub15fejnXBggVeX3pL8dtuu83rS08vkfzXtdAaa6yR1O+8807e26G4jj/+eK+d3na9Kenb/vnPfy7amFA9HnnkkUoPoei4AgMAAAAAAESPExgAAAAAACB6nMAAAAAAAADRYw2MPKZNm5bU4XYz99xzj9f+4IMPCnrMpZZaymunt/AM57+i5ZxzjbbvvffepP7LX/5SkjFcfvnlSR1ulfrZZ58ldbid2c0331yS8QAovo8//jipG3sNP/HEE702WyBj1113rfQQUID0+gHhmhfLLbec17722muTOlxH4vnnn0/qG2+80et78MEHk/qrr77y+s477zyvfdRRRyV1ej2KUMeOHb12ehvXdC1JI0eO9NrhGhlpf/rTn/L2oXR69+5d6SGgGcItl8M1KPr165fUyy67bEnGcMMNNyT1aaedVpJjVBJ/NQMAAAAAgOg1eQLDzNYws6fMbKqZvWZmp+a+v5KZPWZmM3L/rlj64SIW5AIhMoEs5AJZyAVCZAJZyAWykIv6VsgUksWSBjnnXjKzDpImmtljko6U9IRz7hIzGyxpsKTflm6oxZee+nH77bd7fVdddVVSz5w5s8XH6Nu3b1KfffbZXl+5t/Mssmhzkd5+Lqud/r2fcsopXt/RRx+d1CuvvLLXl74E9JZbbvH6XnnlFa89e/bspO7evbvXl750+IQTTljyCVSvaDNRbcJpTzNmzEjqLbfcstzDaa2ayUX68m1J+v777wu631ZbbVWK4VS7mslFS9TitnZFEF0mLrjggrx96S1WJenSSy9N6iFDhnh9b775ZkHHC+935plneu1wKnIxpLd4zWpHILpclFu4ve4VV1zhtd9+++28901PlQ4fZ6211irC6Comqlw888wzSf2HP/zB63vssce8dnoL4samgjXmk08+8drpqWiSNGjQoKT+4osv8j5OOIWlVFNaiq3JKzCcc3Occy/l6oWSpkpaXdIASTflbnaTpL1LNUjEh1wgRCaQhVwgC7lAiEwgC7lAFnJR35q1BoaZ9ZTUR9ILklZxzs2RGkIkqUue+ww0swlmNmHu3LmtGy2i1NxckInax2sFspALZOE9BCFeK5CFXCAL7yH1p+ATGGbWXtJdkk5zzi0o9H7OueHOub7Oub6dO3duyRgRsZbkgkzUNl4rkIVcIAvvIQjxWoEs5AJZeA+pTwVto2pmbdQQjtucc3fnvv2hmXV1zs0xs66SPirVIFvjww8/TOrXXnvN60vPBXvjjTdafIzNN988qX/zm994fQMGDEjqWtsqtVpzkZ63evXVV3t9d911V1KH25Cl1yFoSnqdgh133NHra2xObbWr1kzEJly3pdC1FmJVzbmYNGlSUofzWNOv6W3btvX60lunrrLKKiUaXXWr5ly01ltvvVXpIUQptkysuuqqSR3+n9qvv/7aa4drYaXtscceSb3tttt6fXvv/d8r3Hv27On1lWLNi2oUWy4qbYMNNvDa6TUVQrX2t0daTLlI/0356quvNnrboUOHJnWHDh1adLzw88hLL73ktcPPkWnbb799Uv/f//2f17fDDju0aDzlVsguJCbpeklTnXOXp7pGSzoiVx8h6b7iDw+xIhcIkQlkIRfIQi4QIhPIQi6QhVzUt0KuwPh/kg6TNMXMfvhfUWdJukTSKDM7RtK7kvYvzRARKXKBEJlAFnKBLOQCITKBLOQCWchFHWvyBIZzbpykfNeh9CvucFAtyAVCZAJZyAWykAuEyASykAtkIRf1raA1MGIW7oN7/PHHe+30/OXG9kluzFZbbeW103vrStKuu+6a1NWyf24tS68/IUmbbbaZ1x4/fnze+37wwQdJnV4/JbTyyit77QMHi3PoAAAgAElEQVQPPNBrp/fdBlrrueeeS+ojjzyycgOpQ/Pnz0/qxl4TVl99da89bNiwko0J1W+bbbbx2uE6N7U8b72ajB07Nqnvvfdery+cc96ly383Ozj66KO9vhVXXDGpw/VygOYaOHCg177//vsrNBK0xN/+9reSHyP9erTnnnt6fem/Udq1a1fysZQC75AAAAAAACB6nMAAAAAAAADRq4opJC+88ILXvvTSS5P6xRdf9Pr+85//tOgY4dSPU045JanPOussr699+/YtOgbKo1u3bl777rvv9trXXnttUl900UUFP246E+G2Q7169WrOEIFGOecqPQQAJbThhht67bXXXttrp7dFDLdc7dy5c+kGBk96i8PDDjvM6wvbQLmsv/76Xrt3795JPXXq1HIPB5JuvPHGpL7yyiu9vptvvrkox1hrrbWSernllvP6wmmJxx13XFKH7ze1gCswAAAAAABA9DiBAQAAAAAAoscJDAAAAAAAEL2qWAPjnnvuabTdmPS8sHAbmaWWWiqpTz/9dK9vhRVWaM4QEbGuXbt67SFDhmTWQCXtvvvuSf2Pf/yjgiNB2nrrrZfU4Zba48aNK/dwUKPOPvtsr33ssccmdbgO11//+tekDufCA6h9PXr08NpTpkyp0Ejwgz59+iR1uE3qFlts4bXPOeecpP7000+9vr333jupd955Z69vwIABSb3qqqu2fLA1gCswAAAAAABA9DiBAQAAAAAAolcVU0guueSSRtsAUO2OPPLIzBqVlb5Mc8yYMRUcCWrZvvvu67XvuOOOpH788ce9vvTUxxtuuMHrY5t3AKisZZZZxmsff/zxjbbRfFyBAQAAAAAAoscJDAAAAAAAED1OYAAAAAAA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La5u3bqVbmBAhLgCAwAAAAAARI8TGAAAAAAAIHpMIcnjs88+S+oddtjB6wsv9fzggw/y9gEtNXjwYK99zTXXeO02bdokdb9+/coypnq1//77J/V5553n9TU2haQ59ttvv6QOL2/fZZddinIMoJ5dcMEFST1s2LCiPObDDz9clMcJpacH9O7d2+tLX1qeriVpzTXXLMl4UDoff/xxUodTBRoTThsIP6uiunz55Zdee9y4cUkdfs4IX3eOPfbY0g0MiBBXYAAAAAAAgOhxAgMAAAAAAESPExgAAAAAACB6rIHRAuk1L8I2a2CgWJ5//nmvnd7aV5K23nrrpD7ggAPKMqZ6tdJKKyX17373O69v0KBBSf3FF194fd27d/fa7777bt5jzJ8/P6nD+a2sgYGmzJo1y2uH86lHjhyZ1H/729/yPs7Pf/5zr33jjTcWYXRxuPvuu1t0v3BLyg033LBFj7Peeusl9RtvvOH1pdfdkqSXX345qV977TWv75xzzknqn/70p14fa2DEL71tqiQdfPDBSR1upRlKZzi91S6q33LLLee111lnnaR+//33vb6PPvqoLGNC9brsssuS+ptvvvH6pk6dmtTpbcFD6fcsacn3okriCgwAAAAAABA9TmAAAAAAAIDocQIDAAAAAABEjzUwWqCpOYqoTWPHjk3q3//+915fen655K+Z0Bzpx3n11Ve9vrXWWstrDxs2rEXHQOv88pe/9NrXXHNNUr/yyiteX8eOHVt0jJNOOqlF90Nte/zxx712ej58+BoUrqlgZgUdI1x7p5Y88sgjST1t2jSvb9111817v3BueteuXYs7MEkLFy702ul1NhpbO+f+++/32v379y/uwFB0t9xyi9d+7733knqPPfbw+sL1arp161a6gSEqJ554YlI//fTTXl+4hg7qw5gxY5J6ypQpXl/6bxRJuueee5K6sb9bG/tsMGPGDK/du3dvr51eS6PcuAIDAAAAAABEjxMYAAAAAAAgekwhaYHwcptwuzrUpoEDByZ1eFnV66+/7rXTW5w2R3pqyscff+z1XXfddV57o402atExUFzpLQ3DqUWTJk1q0WN+/fXXrRoTqtexxx7rtdOXiY4fP77gx+nQoYPXPuSQQ5K6b9++Xl96G8d27doVfIxqk56GF07Jq7RwKkhj00aWWWaZpA7zgjhtueWWSR1ONezZ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v3xS33777V7fqquuWpQxXHPNNUl97rnn5r3dT37yE6+d/pulWGMpBa7AAAAAAAAA0eMEBgAAAAAAiB4nMAAAAAAAQPRYA6MIGtuLG5WX3tNcko499tikDucRpte9WHvttb2+9PzldC0tmYH//Oc/SR2uZ9C5c+ekvuGGGxodO+JzyimneO30/OWm5hKn12M56aSTvL70HGVUn80339xrp18jwt/1sssu67XTc9dR3bbaaqukfvDBB72+d999N6nDOdEffvih17777ruTOnyfCOfDp6XXcbr88su9vnC9jCeeeCKpwzWf0LRx48Z57V/96ld5b5ueE3/eeed5fenf/emnn+71hRnq0KFDUu+///5e32WXXZbUM2bM8Pp++ctfZj6GJPXr189r9+jRY8kngIpizYvqst9++zXaLoX777/fa19wwQV5b7v00v/98z9cey/mdS/SeMcCAAAAAADR4wQGAAAAAACIHlNICrDDDjt47QceeKBCI0Eh7rzzTq991FFHee02bdok9QorrOD1pbczWnHFFb2+X//610k9duxYry+cUpK+xDe89C996fAaa6zh9T399NNJvdZaawnx23333Qu+bToXb775pteXvtxv0qRJXt+sWbOSmst7y+uFF15I6j59+nh9bdu2TeqHHnrI67viiiuS+sILL/T6fvGLX3jt559/Pql79+7d8sEiat27d8+ss6RfV7bbbjuv769//WtSv/jiiwUff8yYMV572LBhSR1usYqmTZ48ueDbhtNG0tJb76Zfb7Kkt1ENc5He6n2bbbbJ+xjh9rrpHKA6/fSnP630EFBhe++9t9dubNpR+vNJuOVrteAKDAAAAAAAED1OYAAAAAAAgOhxAgMAAAAAAESPNTAK0NRc1W+//Tap03PVJearV8K1117rtcPf39lnn53URx99dMGPm553HM4ZS89hb0p6HYRwfRXWvaht33zzTVI3tsVVep0WSVpqqaVKNqZ6F25z3L9/f6+d3vryT3/6k9d36KGHJvVKK63k9aW3Tg3XwFi0aJHX/vTTT5sxYtSbdM4k6cADD0zqnXbayesL12dqTLgOD5on3DY7/d4+YMCAvPcL1ziaOXNm5mNI/taokr/uxfTp072+gw8+uKDHCdfAQPXjs2P9Oeuss7x2egttqfGtscP1c6oRV2AAAAAAAIDocQIDAAAAAABEjykkBVh66cZ/TOlL9b7++utSDwdNCC/dTG9RJi25dWmh0tufvvbaa43eduTIkUm9wQYb5L1dt27dWjQWVKdzzjmnoNsdc8wxXpuclM4mm2zitRcsWOC1//jHPyZ1eCl/Y/785z/n7Qsv+2/sNQIIpT+ThPltzhSSddZZp2hjQuPbFjYmfal3+BjhVq3pKbFfffWV17fmmmsm9TPPPOP1hVvGA6g+6WnIL7/8stcXThlJv5aEn0d69epVgtGVF1dgAAAAAACA6HECAwAAAAAARI8TGAAAAAAAIHqsgVGAcE2Fdddd12tPmzYtqcN5RldffXXpBoZMp556alEe57PPPvPao0aNSupwnvyPf/xjr33AAQcUZQwono8//thrH3XUUV47vTVheju61gi36Bw+fHhB9wvXbUHpnHLKKV77oosuytsf3jYtnFM6Y8aMpA6307744ou9djPQlS4AACAASURBVMeOHQsbLKKQ/u/6uuuu8/rWW2+9pC7V+8B3332X1OEaCY0J1/PaYostijamerTXXnt57UsvvTSpR48e7fU999xzSf3KK694fQsXLsx7jJtvvtlrp9dc69Spk9d3/vnnJzXrJtUX1t+rTV988YXXvvXWW5P6sccea/S+Bx10UFKH63c1tsVqtaj+ZwAAAAAAAGoeJzAAAAAAAED0mpxCYmZrSLpZ0qqSvpc03Dn3FzNbSdKdknpKminpAOfcp6Ubajx23XVXr/3+++8n9eWXX17u4VREPeQinP5zzTXXJHWXLl28vqeeeqosY4pZ7Jk4+eSTvfb999/vtadPn57Uq6++uteXbq+99tpe38SJEzMfQ5KGDh3qtcOpR2mDBg1K6tVWWy3v7apN7Lk488wzvXabNm289ksvvZTUTzzxRN7H+fRTf+h77LFHUl922WVeX5ihehR7LtI++OADr73bbrsl9ZQpU7y+MAfF8OGHH3rt9OeMJ598suDH6d27t9feZpttWjewIqumTEhS27ZtvfZyyy2X1OGl31tvvXVSt3S7VUnq0KFDUu+///5eX/o1p5ZUWy4q4cEHH0zq8LNOrarVXKSnlB133HFe3z//+c+89/vTn/7ktU866aSkroUpI6FCntFiSYOcc70l/UzSiWa2vqTBkp5wzvWS9ESujfpBLhAiE8hCLpCFXCBEJpCFXCALuahjTZ7AcM7Ncc69lKsX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9YEHHljOIZUVV2AAAAAAAIDkrfcEhjHmZmPM+8aY17zbuhhjHjXGvJX/s/n/CwJJIRfIQi4QIxPIQi6QhVwgRiaQhVzUt2KuwJgkqX9021mSpllrd5A0Ld9GfZkkcoF1TRK5QGiSyATWNUnkAuuaJHKB0CSRCaxrkshF3VrvGhjW2qeNMb2imwdI+na+vlXSk5LOLOO4yuY//uM/XB1vo9quXbuyH8/fPjO2dOnSoH3HHXe4+oQTTij7WJpTreeikE8++cTVn376adC39dZbu/riiy8O+nr06FHwMefPnx+0J0yY4Oply5YFfX4mzzvvvKCvbdu2BY+RipaaC9/ll18etP0tDuNcoD4yIa27doW/7sUhhxwS9D388MNFP66/dtNjjz0W9C1evDjzeJK0++67F32MaqhGLvytqN99992gz99OMBbPG7/nnntcPXz48PIMrgHdu3cP2v5aHn//+98Lfp+/VXytaCmvF/6aF5J02mmnuTreCtV/b4//rleuXBm0P/zww4LH9B+nQ4cOQZ+/rkuxW7GmoqVkYn3iv1t/i/Z4DbQTTzyx6MdduHChq2+88cYSR5eeeslFqQ4//HBXv/HGGwXvF6/B6G/BvPHGG5d/YGVS6qtYd2vtEknK/7lZoTsaY443xsw0xsyMf1lDi1NULshE3SEXiPEegiy8ViALuUCM9xBk4bWiTjT7aVhr7fXW2r7W2r7xyuuoT2QCWcgFspALxMgEspALZCEXiJGJ2lfqNqpLjTE9rLVLjDE9JL1fzkGVU6Uvu992222Ddp8+fVwdX8Izb968ioypgmomF4X4l+n96U9/Cvr8S7TPOiucVveb3/wmaPuXa55++ulB30MPPeTqLl26BH1nn322q0866aRih526ms+FL76c/Jvf/Kar99xzz0oPp1a1qExIDV9qGU8vKRf/0s9NN920WY5RYc2aiw033NDV8bZy/tao8bS/mP96/4Mf/CDoa46/h3j6aUPTRlqomni9mDJliqvjrVIbmraxzz77uDqeJjZp0qSgPWLEiIKP409PHTRoUIOP0wLURCbWZ82aNa72P0tI4Ran1157bdDXqlXxv74dffTRrn777beDvlGjRhX9ODWiReSiHF5//XVXG2MK3i+ejnTwwQc325jKqdQrMO6X9OWr87GS7ivPcFDjyAWykAvEyASykAtkIReIkQlkIRd1ophtVH8n6VlJOxljFhtjhkm6VNLBxpi3JB2cb6OOkAtkIReIkQlkIRfIQi4QIxPIQi7qWzG7kBxVoKtfmceCGkIukIVcIEYmkIVcIAu5QIxMIAu5qG+lroGBAjbaaKMG20jbHnvs4er99tsv6PPXwJg2bVrQF89bHTlypKvfeeedgseLt0r9xS9+UfxgUTHTp0939XPPPRf0zZ49u6THfPLJJ4N2165dXf3Vr361pMdE9axduzZoW2td3blz56Bv9erVQdtfc+HWW28N+mbNmuXqzTffPOjzt+Lu2bNnI0dc3zp27Bi0v/GNb7h6fWtgvPrqq65etGhR0FfsGhiff/550L7uuusK3veuu+4q6jFRWfG6Ev5WqTF/PTZ/zQtJuvrqq4s+pr89crzORkNba/rre91www1B34wZM4o+Psrr7rvvdnW8Lt7jjz/u6ni9tIb47wtS+Jmlffv2Qd8ZZ5xR9OMibfF6e/5nkHgNjH79/u8cz7nnntu8A2smtbUZNAAAAAAAqEucwAAAAAAAAMljCkmZffbZZ0E7vlTY52+BhzS0adPG1R06dCh4vyVLlgTtI444Img3dOnWRv+PyQAAEutJREFUsGHDXD1w4MCSxonK8rdY7N27d9AXb53siy8x9rcsW7FiRdDnZ2/ixIlB3ymnnFL0WFEd8TbZ/r/7K6+8Mui74oorgrY/TSR25513utq/DBzl5U8hmTx5ctHf9+yzzwZtfxriM888E/T57VWrVgV948ePL/qYDfFfn+KpSyiviy66KGh/8sknBe87duxYV48ZM6boY+y///5B+zvf+Y6ru3fvXvTj+FMH/PcaVJc/ZXDHHXcM+vzXpPV57733XO1PYZbC6Y3xZ4nGZAhpOemkk4L2ffeFG674n0F22223oM//TOtPb6slXIEBAAAAAACSxwkMAAAAAACQPE5gAAAAAACA5LEGRpktWLAgaM+dO7fgffv371/04y5fvtzVr7zyStDnz8EdPHhw0LfTTjsVfQyEevXqVZbH+e53vxu0/W2rttpqq7IcA83r5ptvdnW8RZk/nzjeGvGCCy4I2v5WiYceemjQ9/DDD7v6uOOOC/q23357VzfmdQOVE2+fuXLlSlfPnDkz6PPXyJHCuart2rUL+vr06VOuIaIBw4cPd3W8xfHvfve7gt8Xzykvdr2aeNvdDTYoz/8n+dt9T5kyJejz119C47388stB2/83LoV/p//+97/Lckz/tb9c4tefOIuonKlTp7r6wgsvDPo22mijgt/38ccfB21/HTb/9wVJ+vnPf+7qs846q6RxIg3+lsfxmhf+Oiix448/Pmh369atvAOrAq7AAAAAAAAAyeMEBgAAAAAASB4nMAAAAAAAQPJYA6MEn332WdBevHixq//6178W/TgnnHCCq/fcc8+g76WXXgraH374oasXLVoU9HXo0MHV8+fPD/omTZpU9HgQzludPn160BfPG23I9773PVc/8MADTR8YKuq1114L2mvWrHF1q1aFXzZffPHFoB2vV3HkkUcW/N4hQ4a4+i9/+UvQd8kllxR8TKTh9ddfD9rPPfecq/33CCn8u44NGjQoaLMGRuWNGjUqaN95551lP0a85oW/Dkq5+BmUWAOjFP57gb/OgCStWLEiaJdrHZPmsGrVKlfHazWlPO6WZtq0aQX7BgwYULDPXytDCte1kKR33nnH1dttt13Q539+2GSTTYoaJ9Lkr8e2ZMmSBu+78847u7qhbNUqXrUAAAAAAEDyOIEBAAAAAACS1+KnkHz66aeufv/994O+WbNmufr5558P+h5//PGiHlOS3njjjZLG5l9y/NFHHzV435/97Geu9qcnSOH2fdtss01JY0HO0KFDXX3vvfcGfY25xLc5LgdG5SxdurRgX0NbE++yyy5Be/z48SUd/8QTTwzau+66a0mPg+rZd999Xf3qq68W/X1jx45tjuEgMfH2mPF7hr/9dqdOnYK+eLtFNJ9TTz3V1f5l+rXm7rvvdrW/FSMqa7PNNgvabdu2dfUPf/jDoM+f9rNs2bKgz9++XQqnOMdbOXfs2LG0waLqrrrqqqB90003uXp9v2c8+uijrt5iiy3KO7AEcAUGAAAAAABIHicwAAAAAABA8jiBAQAAAAAAklfza2DE61Gcf/75Qfv+++939dy5c0s6RrztUPv27YO2v62iv91ibPjw4UG7oW1U0XzeffddV/tbEknSPffc4+p4fpn/d7T77rsHfbfcckvQjtdbQcvRs2fPgn3+lsbNdQzUnnhb3rVr1wZttjFsObp06eLqr3zlK0Gfvz3rUUcdVfRjxtuqswZGmi6//PJqD8F58803g/bo0aML3rdXr15B21+XAeUVr2f1P//zP6721zeQpD322MPV8etF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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d6b868fe10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(15,6))\n",
    "for i in range(24):\n",
    "    plt.subplot(3,8,i+1)\n",
    "    plt.imshow(255-X_train[i], cmap='gray', interpolation='none')\n",
    "    plt.title(\"Class {}\".format(y_train[i]))\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.487869Z",
     "start_time": "2018-03-22T11:14:09.328705Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x1d6bd71be10>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d6b8674c18>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    " plt.imshow(255-X_train[31], cmap='gray', interpolation='none')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.554117Z",
     "start_time": "2018-03-22T11:14:09.489146Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0  42 154 180 255 176 118 118  16   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0 142 253 253 253 253 253 253 236 103   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0 227 253 253 204 177 177 177 243 191   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0 227 253 216  22   0   0  23 227 238  96  21   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0 227 253 205   0   0  17 124 253 253 253 170   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0 227 253 234  62  18 201 253 253 253 251  90   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0 227 253 253 253 253 253 253 253 221 103   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0 227 253 253 253 253 253 208  24   5   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0  39 236 253 253 253 251  97  16   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   4  69 224 253 253 240 169  46   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0  33 134 253 253 253 253 105   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0  51 225 253 253 253 253 253  68   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0  48 227 253 253 250 174 253 253  68   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0 213 253 253 179  63 111 253 253  68   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0  92 251 201  13   5   0 166 253 253  68   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0  39 222 253 198   0   0   0 248 253 231  46   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0  54 243 253 124   0  38 133 252 253 150   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0 118 253 253 237 179 223 253 253 190  14   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0  44 230 253 253 253 253 253 244  76   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0  45 231 253 253 253 182  66   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n",
      "   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0\n"
     ]
    }
   ],
   "source": [
    "for x in X_train[31]:\n",
    "    for i in x:\n",
    "        print(str(i).rjust(4), end='')\n",
    "    print()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Let's see the distribution of the digits"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T13:38:21.283978Z",
     "start_time": "2018-03-22T13:38:21.115426Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d6b8674b38>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.hist(y_train, bins=10, orientation='horizontal');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data Preparation\n",
    "### Scale data to [0,1] instead of [0, 255]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.850120Z",
     "start_time": "2018-03-22T11:14:09.717634Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training matrix shape (60000, 28, 28)\n",
      "Testing matrix shape (10000, 28, 28)\n"
     ]
    }
   ],
   "source": [
    "X_train = X_train.astype('float32')\n",
    "X_test = X_test.astype('float32')\n",
    "X_train /= 255\n",
    "X_test /= 255\n",
    "print(\"Training matrix shape\", X_train.shape)\n",
    "print(\"Testing matrix shape\", X_test.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### one-hot encode the class output"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.855244Z",
     "start_time": "2018-03-22T11:14:09.851523Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([5, 0, 4], dtype=uint8)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train[:3]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.892056Z",
     "start_time": "2018-03-22T11:14:09.856446Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "n_classes = len(np.unique(y_train))\n",
    "Y_train = np_utils.to_categorical(y_train, n_classes)\n",
    "Y_test = np_utils.to_categorical(y_test, n_classes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.921652Z",
     "start_time": "2018-03-22T11:14:09.893659Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0., 1., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],\n",
       "       [0., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Y_train[:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### prepare 2 sets of data\n",
    "#### The flat version for considering each pixel as an input\n",
    "Since the images are 28x28 pixels, there are 784 pixels"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.954439Z",
     "start_time": "2018-03-22T11:14:09.922953Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training X_train_flat shape (60000, 784)\n",
      "Testing X_test_flat shape (10000, 784)\n"
     ]
    }
   ],
   "source": [
    "X_train_flat = X_train.reshape(-1, 784)\n",
    "X_test_flat = X_test.reshape(-1, 784)\n",
    "print(\"Training X_train_flat shape\", X_train_flat.shape)\n",
    "print(\"Testing X_test_flat shape\", X_test_flat.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-20T15:22:46.472156Z",
     "start_time": "2018-03-20T15:22:46.463902Z"
    }
   },
   "source": [
    "#### In the case we want to process them as images, we need to take into account the channels\n",
    "In this example is not particularly relevant, but it is generally needed as images normally have 3 channels (e.g. RGB: Red, Green, Blue). Other examples could be channels of different bands (e.g. infrared, ultra-violet, etc.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:09.990766Z",
     "start_time": "2018-03-22T11:14:09.955870Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training matrix shape (60000, 28, 28, 1)\n",
      "Testing matrix shape (10000, 28, 28, 1)\n",
      "Input shape (28, 28, 1)\n"
     ]
    }
   ],
   "source": [
    "# input image dimensions\n",
    "img_rows, img_cols = 28, 28\n",
    "\n",
    "if K.image_data_format() == 'channels_first':\n",
    "    X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols)\n",
    "    X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols)\n",
    "    input_shape = (1, img_rows, img_cols)\n",
    "else:\n",
    "    X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 1)\n",
    "    X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 1)\n",
    "    input_shape = (img_rows, img_cols, 1)\n",
    "\n",
    "print(\"Training matrix shape\", X_train.shape)\n",
    "print(\"Testing matrix shape\", X_test.shape)\n",
    "print(\"Input shape\", input_shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Feature Engineering\n",
    "We are not doing any feature engineering today. We will work with the images as they are"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Machine Learning\n",
    "### Neural network using each pixel as an input"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:10.144457Z",
     "start_time": "2018-03-22T11:14:09.992571Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_1 (Dense)              (None, 128)               100480    \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 101,770\n",
      "Trainable params: 101,770\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = Sequential()\n",
    "\n",
    "model.add(Dense(128, activation='relu', input_shape=(784,)))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(10, activation='softmax'))\n",
    "        \n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:56.894026Z",
     "start_time": "2018-03-22T11:14:10.146469Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/10\n",
      "60000/60000 [==============================] - 2s 38us/step - loss: 0.5052 - acc: 0.8518 - val_loss: 0.2203 - val_acc: 0.9348\n",
      "Epoch 2/10\n",
      "60000/60000 [==============================] - 2s 31us/step - loss: 0.2652 - acc: 0.9217 - val_loss: 0.1584 - val_acc: 0.9532\n",
      "Epoch 3/10\n",
      "60000/60000 [==============================] - 2s 32us/step - loss: 0.2157 - acc: 0.9377 - val_loss: 0.1358 - val_acc: 0.9603\n",
      "Epoch 4/10\n",
      "60000/60000 [==============================] - 2s 32us/step - loss: 0.1874 - acc: 0.9449 - val_loss: 0.1137 - val_acc: 0.9663\n",
      "Epoch 5/10\n",
      "60000/60000 [==============================] - 2s 36us/step - loss: 0.1678 - acc: 0.9500 - val_loss: 0.1051 - val_acc: 0.9682\n",
      "Epoch 6/10\n",
      "60000/60000 [==============================] - 2s 38us/step - loss: 0.1566 - acc: 0.9531 - val_loss: 0.0946 - val_acc: 0.9722\n",
      "Epoch 7/10\n",
      "60000/60000 [==============================] - 2s 38us/step - loss: 0.1438 - acc: 0.9569 - val_loss: 0.0970 - val_acc: 0.9722\n",
      "Epoch 8/10\n",
      "60000/60000 [==============================] - 2s 35us/step - loss: 0.1378 - acc: 0.9581 - val_loss: 0.0898 - val_acc: 0.9725\n",
      "Epoch 9/10\n",
      "60000/60000 [==============================] - 2s 38us/step - loss: 0.1282 - acc: 0.9609 - val_loss: 0.0884 - val_acc: 0.9735\n",
      "Epoch 10/10\n",
      "60000/60000 [==============================] - 2s 40us/step - loss: 0.1259 - acc: 0.9608 - val_loss: 0.0850 - val_acc: 0.9750\n"
     ]
    }
   ],
   "source": [
    "model.fit(X_train_flat, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat, Y_test));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Quite good results! Let's try with a deeper network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:14:57.045315Z",
     "start_time": "2018-03-22T11:14:56.895775Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_3 (Dense)              (None, 128)               100480    \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 128)               16512     \n",
      "_________________________________________________________________\n",
      "dropout_3 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 118,282\n",
      "Trainable params: 118,282\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = Sequential()\n",
    "model.add(Dense(128, activation='relu', input_shape=(784,)))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(128, activation='relu'))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(10, activation='softmax'))\n",
    "\n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:15:18.483607Z",
     "start_time": "2018-03-22T11:14:57.046759Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/10\n",
      "60000/60000 [==============================] - 3s 47us/step - loss: 0.6482 - acc: 0.7980 - val_loss: 0.2146 - val_acc: 0.9354\n",
      "Epoch 2/10\n",
      "60000/60000 [==============================] - 2s 40us/step - loss: 0.3172 - acc: 0.9080 - val_loss: 0.1640 - val_acc: 0.9501\n",
      "Epoch 3/10\n",
      "60000/60000 [==============================] - 3s 45us/step - loss: 0.2581 - acc: 0.9255 - val_loss: 0.1366 - val_acc: 0.9589\n",
      "Epoch 4/10\n",
      "60000/60000 [==============================] - 3s 49us/step - loss: 0.2259 - acc: 0.9342 - val_loss: 0.1268 - val_acc: 0.9627\n",
      "Epoch 5/10\n",
      "60000/60000 [==============================] - 3s 49us/step - loss: 0.2029 - acc: 0.9410 - val_loss: 0.1160 - val_acc: 0.9649\n",
      "Epoch 6/10\n",
      "60000/60000 [==============================] - 3s 52us/step - loss: 0.1882 - acc: 0.9449 - val_loss: 0.1058 - val_acc: 0.9678\n",
      "Epoch 7/10\n",
      "60000/60000 [==============================] - 3s 51us/step - loss: 0.1772 - acc: 0.9482 - val_loss: 0.0926 - val_acc: 0.9706\n",
      "Epoch 8/10\n",
      "60000/60000 [==============================] - 3s 52us/step - loss: 0.1665 - acc: 0.9509 - val_loss: 0.0990 - val_acc: 0.9688\n",
      "Epoch 9/10\n",
      "60000/60000 [==============================] - 3s 50us/step - loss: 0.1603 - acc: 0.9518 - val_loss: 0.0926 - val_acc: 0.9717\n",
      "Epoch 10/10\n",
      "60000/60000 [==============================] - 3s 51us/step - loss: 0.1550 - acc: 0.9554 - val_loss: 0.0923 - val_acc: 0.9727\n"
     ]
    }
   ],
   "source": [
    "model.fit(X_train_flat, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat, Y_test));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Let's use now a convolutional network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:15:18.812491Z",
     "start_time": "2018-03-22T11:15:18.485237Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_1 (Conv2D)            (None, 26, 26, 8)         80        \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 13, 13, 8)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 11, 11, 16)        1168      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 5, 5, 16)          0         \n",
      "_________________________________________________________________\n",
      "dropout_4 (Dropout)          (None, 5, 5, 16)          0         \n",
      "_________________________________________________________________\n",
      "flatten_1 (Flatten)          (None, 400)               0         \n",
      "_________________________________________________________________\n",
      "dense_6 (Dense)              (None, 64)                25664     \n",
      "_________________________________________________________________\n",
      "dropout_5 (Dropout)          (None, 64)                0         \n",
      "_________________________________________________________________\n",
      "dense_7 (Dense)              (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 27,562\n",
      "Trainable params: 27,562\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "cnn = Sequential()\n",
    "cnn.add(Convolution2D(8, kernel_size=(3, 3), activation='relu', input_shape=(28,28,1)))\n",
    "cnn.add(MaxPooling2D(pool_size=(2,2)))\n",
    "cnn.add(Convolution2D(16, (3, 3), activation='relu'))\n",
    "cnn.add(MaxPooling2D(pool_size=(2,2)))\n",
    "cnn.add(Dropout(0.5))\n",
    " \n",
    "cnn.add(Flatten())\n",
    "cnn.add(Dense(64, activation='relu'))\n",
    "cnn.add(Dropout(0.5))\n",
    "cnn.add(Dense(10, activation='softmax'))\n",
    "\n",
    "cnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "cnn.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:26.353997Z",
     "start_time": "2018-03-22T11:15:18.813851Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/10\n",
      "60000/60000 [==============================] - 17s 291us/step - loss: 0.7768 - acc: 0.7489 - val_loss: 0.1571 - val_acc: 0.9555\n",
      "Epoch 2/10\n",
      "60000/60000 [==============================] - 18s 303us/step - loss: 0.3427 - acc: 0.8961 - val_loss: 0.1069 - val_acc: 0.9680\n",
      "Epoch 3/10\n",
      "60000/60000 [==============================] - 19s 309us/step - loss: 0.2757 - acc: 0.9174 - val_loss: 0.0855 - val_acc: 0.9735\n",
      "Epoch 4/10\n",
      "60000/60000 [==============================] - 18s 303us/step - loss: 0.2369 - acc: 0.9288 - val_loss: 0.0772 - val_acc: 0.9756\n",
      "Epoch 5/10\n",
      "60000/60000 [==============================] - 19s 323us/step - loss: 0.2163 - acc: 0.9355 - val_loss: 0.0651 - val_acc: 0.9790\n",
      "Epoch 6/10\n",
      "60000/60000 [==============================] - 19s 316us/step - loss: 0.2022 - acc: 0.9397 - val_loss: 0.0619 - val_acc: 0.9800\n",
      "Epoch 7/10\n",
      "60000/60000 [==============================] - 24s 392us/step - loss: 0.1912 - acc: 0.9436 - val_loss: 0.0556 - val_acc: 0.9826\n",
      "Epoch 8/10\n",
      "60000/60000 [==============================] - 21s 343us/step - loss: 0.1804 - acc: 0.9460 - val_loss: 0.0518 - val_acc: 0.9831\n",
      "Epoch 9/10\n",
      "60000/60000 [==============================] - 21s 342us/step - loss: 0.1727 - acc: 0.9492 - val_loss: 0.0517 - val_acc: 0.9832\n",
      "Epoch 10/10\n",
      "60000/60000 [==============================] - 20s 341us/step - loss: 0.1683 - acc: 0.9496 - val_loss: 0.0498 - val_acc: 0.9844\n"
     ]
    }
   ],
   "source": [
    "cnn.fit(X_train, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test, Y_test));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Convolutional Neural Network performs better with fewer parameters"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## So far so good, but what about if we would have a *more difficult* problem?\n",
    "**56x56** instead of 28x28 with the number in a random location\n",
    "### Prepare data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:26.857182Z",
     "start_time": "2018-03-22T11:16:26.356239Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "(X_train, y_train), (X_test, y_test) = mnist.load_data()\n",
    "Y_train = np_utils.to_categorical(y_train, n_classes)\n",
    "Y_test = np_utils.to_categorical(y_test, n_classes)\n",
    "X_extendend_train = np.zeros((60000, 56, 56))\n",
    "X_extendend_test = np.zeros((10000, 56, 56))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:27.659113Z",
     "start_time": "2018-03-22T11:16:26.858871Z"
    },
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for i in range(60000):\n",
    "    posx = np.random.randint(0, 28)\n",
    "    posy = np.random.randint(0, 28)\n",
    "    X_extendend_train[i,posx:posx+28, posy:posy+28] = X_train[i]\n",
    "for i in range(10000):\n",
    "    posx = np.random.randint(0, 28)\n",
    "    posy = np.random.randint(0, 28)\n",
    "    X_extendend_test[i,posx:posx+28, posy:posy+28] = X_test[i]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:29.455093Z",
     "start_time": "2018-03-22T11:16:29.450926Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training X_train_flat shape (60000, 3136)\n",
      "Testing X_test_flat shape (10000, 3136)\n"
     ]
    }
   ],
   "source": [
    "X_train_flat_extended = X_extendend_train.reshape(-1, 56*56)\n",
    "X_test_flat_extended = X_extendend_test.reshape(-1, 56*56)\n",
    "print(\"Training X_train_flat shape\", X_train_flat_extended.shape)\n",
    "print(\"Testing X_test_flat shape\", X_test_flat_extended.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:29.486975Z",
     "start_time": "2018-03-22T11:16:29.456244Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training matrix shape (60000, 56, 56, 1)\n",
      "Testing matrix shape (10000, 56, 56, 1)\n",
      "Input shape (56, 56, 1)\n"
     ]
    }
   ],
   "source": [
    "# input image dimensions\n",
    "img_rows_extended, img_cols_extended = 56, 56\n",
    "\n",
    "if K.image_data_format() == 'channels_first':\n",
    "    X_train_extended = X_extendend_train.reshape(X_extendend_train.shape[0], 1, img_rows_extended, img_cols_extended)\n",
    "    X_test_extended = X_extendend_test.reshape(X_extendend_test.shape[0], 1, img_rows_extended, img_cols_extended)\n",
    "    input_shape_extended = (1, img_rows_extended, img_cols_extended)\n",
    "else:\n",
    "    X_train_extended = X_extendend_train.reshape(X_extendend_train.shape[0], img_rows_extended, img_cols_extended, 1)\n",
    "    X_test_extended = X_extendend_test.reshape(X_extendend_test.shape[0], img_rows_extended, img_cols_extended, 1)\n",
    "    input_shape_extended = (img_rows_extended, img_cols_extended, 1)\n",
    "\n",
    "print(\"Training matrix shape\", X_train_extended.shape)\n",
    "print(\"Testing matrix shape\", X_test_extended.shape)\n",
    "print(\"Input shape\", input_shape_extended)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:19:32.864858Z",
     "start_time": "2018-03-22T11:19:31.021855Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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9atfATB79mwA7r//frbaaqu61dWezZo1C4Bx48YBcNhhhzFjxgwAttxySwBOO+00ADbffHO++uorAPbaay8A7rrrrmaP169fv+oXLUlSB+UpJJIkSZIkKXl2YEiS1M4NHz4cgHPOOQeAhRZq/vlECKHWJXUYI0eOBODQQw8tXDdw4EAgdzoJQNeuXQu3ZdeVdl706NEDgIMOOqh6xUqS1MHZgSFJkiRJkpJnB4YkSe3c22+/DVCYf0Ftd+qppwJw9tlnA8Uulp///OeFuUaadl5kfvOb35R9vEsvvRSA5ZdfvuK1SpLUKOzAkCRJkiRJybMDQ5Kkduyee+7h97//fbPr1lprLQBuu+02AFZcccWa19VenXHGGUCx86Jz584A7LDDDgCce+65dOnSpdl9vvzySyA378XEiROB4rKpWSfHoEGDqly5JDU3ZMiQQvfXOuusAxRfF3r16lW3ulQZr776KgAzZ84E4KGHHgJynYKlc2GVk70uZUt7Z693qbMDQ5IkSZIkJc8ODEmS2qGHH34YgIMPPpjp06c3u+24444D/ISttaZNm8Zll10GFOe8yDov/vGPf8yx/euvvw7AfvvtB8D48eMLt/3whz8Eiv8WklQrEyZMAHKrKGWfxL/00ksAvPzyy4CvD+3V888/z9VXXw3ADTfcAMDs2bMBePfdd4HcSmQtWX3slltuAeCnP/0pABdffDFQfn6nlDiAIUlSO5S9gZk8eXLhuq222gqAAw88sC41tXczZ85kypQpza7L2q8/+OADAP76178W3vQ9//zzAHz22WdAbtAje9O4//77A7DEEktUv3BJamK55ZYDYMsttywcr9QxnHzyyYwdO7aij3nNNdcA8OMf/xiAzTffvKKPX2meQiJJkiRJkpJnB4YkSe1I1iFw1VVXAblW0W7dugHFCSO1YDp37lxY5vTDDz8E4Fvf+hZA2XbclVdeGSi2206ePLnwyecuu+xS9XolqZys88vTRDqegQMHztGBscIKKwDFDorZs2fPMYnnI488AsCDDz5Ygyqryw4MSZIkSZKUvPl2YIQQVgWuAVYCZgPDYoyXhBCWAUYBvYEJwF4xxo+rV6pSYi6qL5sM7g9/+ANQPD8tO7d98ODBbLjhhvUprgwzoXLMReVkk7Ltueeec9w2ePBgALbddttalrTAUs1Ft27dCpN17rzzzgB89NFHAKy++upAbtm5gw8+GIBlllkGgL333hvIdWBk36t1Us1ESj799NPCfCv//Oc/geLcLEOHDmXRRRetW23VYi4WzLRp0wB45pln6lxJdTRyLn72s5+x2267NbtukUUWAWCllVaa6/0++eQTILecbjbZZyZ7vI033riSpVZNSzowZgFDY4x9ge8BR4YQ1gZOBO6NMfYB7s3/rMZhLlTKTKgcc6FyzIVKmQmVYy5UjrloYPPtwIgxTgYm57//NITwErAKMAjYOr/Z1cD9wAlVqVLJMRfV9fTTTzNw4ECgOGKanX89YsQIILf00dSpU+tTYBlmQuWYi8q54447AHj22WebXT9gwACGDBlSj5IWWMq52HTTTYHiHBjzkp1L/MADDwC5+UhWW2216hXXgaWciXp56623ADjvvPMAePTRRwsr35R67733CivmdCTmYsHMmDEDgIkTJ85x27hx4wBYa621gPY5T0Yj52LhhRdm1VVXbfX97rzzTgA+/njOhpQePXoAtJsurlZN4hlC6A1sADwOrJgPDzHGySGEFeZyn8OBwwF69uzZllqVqNbmwkzM3X/+8x8g1yI+ffp0oDhwseSSSwK5SeYApk6dyqOPPgrARhtt1Oy2evNYoXLMxYLJTmk48cTmHyRly5xdffXVLLXUUjWvq1La82vIF198AVCYLC2E4CkkFdCox4qXX34ZgIsvvhiAkSNHAvDll18CEGMs/OGSvSd46aWXABg9ejQ///nPgeIfph1No+ZiQWQTDB988MGcfvrpzW7Lfs4mfz7qqKNqWVrFtefXkFq4/vrrARg2bBhQfN1q6owzzqhpTW3V4kk8QwhLAH8HjokxftLS+8UYh8UY+8UY+2Uze6vjWJBcmImOzWOFyjEXKsfXEJXyWKFyzIXK8TWkMbWoAyOEsAi5cFwbYxyTv/r9EEL3/OhWd+CDahWpNJmLtsta/J588kkA9t9/fyA3EVypNdZYA4ATTsh1wu29996FT2DPPPNMAE4++eTqFjwfZkLlmIsFN2HChLKTdgKFUxVWXHHFWpZUMR0hFzvssEO9S+hQOkImWivrtjzhhBMYNWoUkJuss5w+ffoU2sBnzpwJQN++fYHc8srZEssdTSPmolJOO+20OTowOgpzMXcjR47knHPOAeCNN94A4Ouvv55ju/XXXx8oTgLaXsy3AyPk+tevBF6K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vLFG1ak9uueeexgzZgxQPM5Mnz4dgBDCHNs/9thjtStOklQRRx55JAD3338/AC+//HIdq1Gje+CBB3juueeA4t9FN910E1BcOQfmfB/y2muvAdC3b99Cl0aKHMBQh3P44YcDxf+E2VJW2R+l5WSDHVOnTuWKK64AYL311qtmmUrQyJEjAXj22WeBebfQzStPalzZhG3ZG4dx48bNsc2SSy4JwH777QdAv3792HfffQFYbLHFalGmJKmCNtlkk2Y/jx49GoBzzz2X7t2716MkdWCTJ08Gisv3vvnmm81unz59Op9//jlQHLDYcMMNAXjqqafm+rizZ88GYMaMGZUtuMI8hUSSJEmSJCXPDgx1OF26dAGKbVFffvnlXLfNJmmcOHEiAAsttNA8t1fHk7V57r777rz++usAzJo1a77323XXXatal9qHqVOnAnDSSScBcNVVVwHFU9Y22mgjTjzxRADWWWcdoHiM6tmzZ01rlSRVV/Zp98yZMwG45ZZbOOKII+pZkjqYe+65h8MOOwyAd955Z77bZ53oyy23HABTpkwpTDZ7yCGHADBp0qRm91l77bUrVm812IEhSZIkSZKSZweGOpTTTjutMOFithRQubksPvvsMyB3biIUz/X63ve+V5jIUY0hm6TorbfealHnReaiiy4C4Pe//31V6lL7cOaZZwJw5ZVXAjB48GCgOK/OEkssUZ/CJEk1VzopYtaJIVXKeeedN9fOi0UXXRTI/X2z6aabArDmmms222bZZZflkksuAebsvOjduzcAI0aMqGTJFWcHhiRJkiRJSp4dGOoQspHIK664goUXzsX6j3/8IwDLL7/8HNsPHToUgBtuuAGAlVdeGYB///vfVa9Vadl9992B3Ij2CSecAMx73pRMNgO0GkfWqZV1bl1zzTWFTzG22WYbAHbYYQfA1UQkSVLl3HXXXUD55dZXXXVVoNg5Mb+V8ko7LzLZ/G7ZfBmpsgNDkiRJkiQlzw4MtWvPPfccAHvssQeQm1k3Owd9q622Knuf888/n+HDhze77pRTTqlekWoXjj76aPr06QPAtGnTmt02a9YsjjrqKAA++eSTmtemNJx11llAsQNjr732YvvttwfsuJAkSdVzwQUXAMVuUID+/fsDcPrppwPz7rz4+OOPAbj99tt58MEHm92WPc4PfvCDitVbTQ5gqF3JJlkcOXIk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dYGs5fwvf/kLUFoW9dRTTwXgl7/8JVC9+3biiSfypz/9CYCVVloJgNNPPx0ojWtT93jggQeA0soRAJMnT17kvvfeey8A/fv3B+Bzn/tc9xanhrXssssC1Z4Xw4cPB6B37951q0n19e1vfxuAmTNnAtUVAzITJkzg5ptvBuCwww5r99dfddVVK708/vnPf7Z6bZ999mn311N6OrsKWdbzIlvx5o033gBKcydk82GsuuqqnXoPddyCBQuAUk/QbD6LSy+9FIBevRb+0+zAAw8E4MUXXwTgpJNOKqJM1cnEiRMBKssqZ7LVDLMVC5uZPTAkSZIkSVLy7IEhdYHPf/7zAHzpS18CSj0w7rrrLgD++te/AtU1vVvONJ6NZ8ubbVpdKxtzvuGGGwKwzjrrtHr9qquuqtzVyNbezlq7x4wZwzHHHFNUqWoQU6ZMYezYsUB1BaGsF1U2zlzNZ8kllwSqq0tk555p06ZV9sl65n3zm98E2nfHffbs2Qv1vFDjijEC1Xl0oLpizcEHH9zmr/Puu+9W9r/ttttavZZd726//XY22GCDTtWrzst6wUydOpW7774bqPbIrXX99ddXeo4ucj3X8wAAEN5JREFUv/zyQHVVO/VMhx56KABnn302AO+99x4AX//61+tWU2pswJC6QPaHbp8+fSrbZs2aBVQn28l+SQkhVE5Ou+++e5FlNrUrrrgCKP0yANWf2fz584FSN+/f/OY3QHV52z//+c9A6ZfJddddF4ARI0YUV7SS9M477wClLLzyyisAnH/++YBLIKtqhRVWAODLX/4y0LoBI1t+9+WXXwbyGzCyc1N2XspkS6WqZ8iWz9x3330r55bMNttsA1S7jO+2226VBohsos/sd4v58+dXlknNJgbPltPdY489AGy8SMTVV18NwPrrr185P9R69dVXgdLNr6xxK7uR4vCf5pBN3qqFOYREkiRJkiQlzx4YdfDf//3fANxxxx0APPXUUzz//POt9hk2bBhQ6u4H1Ts5Sltbuo2PHDmy0v1vjTXW6OaKBKUlqbJJs2onyHriiSeA0t302rvn++67LwAPPvggP/nJTyr7qbllSxK+8sor7LfffoCTqmnRsjus11xzzUKvPfzww0B1GOLf/va3ysd3330XgB/96EeLfY9saFxHlmVVfW233XYA3HzzzZUem1lPjPvvvx+oThKcTUbdUsslnLNJhLOhJO0ZgqLiZL//n3322Sy11FKtXssmfM+yMGfOHP7zP/8ToDI5vNTs7IEhSZIkSZKSZw+MAsyZMweoLpf2xz/+EYB+/foBpYkf11prLQDuu+8+AB566CEAttpqK6A0WZzS9fHHHwPVuyPZmNSWdtppJ6D681dxZs+eXfl37RjgjTfeGPj0u5xHHnkkm2yySfcUp4aRTch77bXXAqUlVPfee+96lqQGkF37s+WZf/e731Vey8a0500S3PLO+uJkvyPceuutQHUSODWO4cOHM2nSJAAuv/xyoG29b1ZbbTUAvvrVr1bmS7HXbpqyyd0z2TK3UO2VkfW2yCZ8/+xnP1vpAdq3b98iypSSZw8MSZIkSZKUPHtgFCAbMz99+nSgOn76u9/9LtB66aTnnnsOgC9+8YsAvPDCC0BpnNwZZ5xRSL1qv2wc/C233AJUZwxvKW+bijdo0KBWz1uuHNPWz1Fzyc7d2ZwomauvvrrVHTTp02TzpIwbN65N+2c9L9pz7ciWW7QHRmPKrjU//OEPgeryp2PGjAHg+eefr8x3kv0Ome2z9dZbF1qr2m+VVVYBYJlllgFgn332qcx18/rrrwPVFdKynrzHHHOMPWqkGjZgdLM777yTJ598EiidqIBKV7A82YXp+OOPB6rdB6+88kobMBIyc+ZMoLo058033wxUf9HcYost2GyzzYDSzw7gtddeK7pMlcUYc4f1tNV9993XpoYO9Tzvv/8+P/3pT4HqxHrZ5GrZ0oRSd8iWbs6uKyNHjgRKw0/PPvvsutWl4hxyyCGtPqqxZUNRf/3rXwMwduzYygS++++/P1AdTrblllsC1SElkqocQiJJkiRJkpJnD4xu9tFHH1XuomTDDNoiW84x64HxwQcfVJZWchKf+ssmYjrzzDNbbc9+Xsccc0xlMrWsB8aQIUMKrFAthRA6NITno48+AuDSSy/loIMO6uqy1ACuvPJKLr30UqA04TLkL4cpdUY2lHTNNdcESsNNsjuytZ588kl7YEgNrOUyt1nv0KzndTbpeNazNxtuIqnKHhiSJEmSJCl59sDoZttuu21lDozllluuzZ+XTeKTmT17Ntdffz0ARxxxRNcVqHa79957OfbYY1ttGz9+PADbb789AK+++upCd8gGDx5cSH1a2JAhQxg4cCBQXQLzyCOPXOT+Wc+LbJ+XXnrJu+5N5pFHHgHg3HPP5fvf/z4Ahx9+OLDw+Vlqi89+9rNA6a7riy++CMBGG20EwFFHHQXQ6eWaJ0yYAMBbb73Fiiuu2KmvJan73XfffQD84he/AOD0008H4Atf+ELdapJSZw8MSZIkSZKUPHtgdLOOjl3LlsXK5k149tlnmTp1apfVpY6bMGFCZTWC4cOHA7DzzjsD1Tv3t99+e2WfbHxj//79iy5VZQMHDuS0004DqksZZr71rW8B8I9//IPJkycDpbvuUP3/e8cdd/jzazLZUtYzZsyocyXqKbL5q7LVq7rDK6+8AsD8+fO77T0kdZ0DDjgAgM985jMAjB49up7lSA2hzT0wQghLhhCeDCHcXn6+dghhYgjhhRDCDSGE3t1XplJkJpTHXCiPuVAtM6E85kJ5zIVqmYnm1Z4eGMcBU4BsCYzzgZ/HGMeFEH4NHApc2sX1Na2lllqq1cdENWUmllhiicqKFtnHrOdFtvLIcccdVxl/fNhhhwHVMc5NIMlcZGurZ7KeGC239+nTB6Ayx0k290Hv3l4Du0CSuVBdmYkO6NevH6utthpQmm8pz2mnncZll10GQK9eDdfZ1lwoT4/LxWOPPcacOXMAuPjiiwFYfvnl61lSo+lxmVDbtOmqFkIYBOwE/Bg4MZT+atsWOKC8y9XAWRiSLvPhhx8CpeVTMyktn9rMmXj99dcr/x4wYAAAO+ywAwAPPPBA5bVs+dRddtmlwOrqqxFykTVY1DZoqPs0Qi5ULDPRcWuvvXZlicU99tgDqC69mLnmmmsa8g8ic6E8PS0X2e/2hx9+OKuvvjoABx54YD1Lajg9LRNqn7YOIbkIGA18Un6+MvB2jHFB+fkMYPW8TwwhjAohPBZCeKzlH35qeGZCecyF8pgL1TITymMulMdcqJaZaGKL7YERQtgZeC3G+HgI4WvZ5pxdY97nxxgvAy4DGDp0aO4+Wtj06dMBeP755yvbRowYkbvvnDlzeOqppwB4+OGHAdh7770B2GCDDbq8tmbPRLbsHcBNN90EVCfqXGmllQA4+uijK0uqNotmz4XymQvVMhOdN2zYMKA6bDHr6Zd1Rwd4/PHHgepk06kzF8rTE3OR9dCdPHkykyZNAhqrp1S99cRMqH3aMoTkK8CuIYSRwDKUxhldBPQLIfQqt3QNAmZ2X5lKjJlQHnOhPOZCtcyE8pgL5TEXqmUmmtxiGzBijKcBpwGUW7lOjjF+K4Twe2AvYBxwCHBbN9bZ42VzXmRL9j300EML7XPEEUcAsMUWWwDw5JNPAvDmm2/y8ssvA9VJCKdNmwbAVVdd1eW1NnsmDjnkkMoSdeeccw4AQ4cOBWDXXXcF4IQTTqhPcXXU7LlQPnOhWmai63zhC18A4MILLwRgzJgxQGlp7y233LJudXWEuVCenpiLbH6aTTfdtFWvXrVNT8yE2qfNy6jmOIXSpCnTKI07Gts1JamBmQnlMRfKYy5Uy0woj7lQHnOhWmaiSbRrba0Y473AveV/vwh8setL6lnef/99XnvtNaA6HnXixIkA3H333a32A3j22WcX+bWeeeYZAN55551W2//jP/6DnXbaCYCVV14ZKM1SXoRmzMSKK67I6NGjASof1Voz5kKLZy5Uy0x0jQMOOKDVx0ZnLpSnp+TirbfeAuCMM85oxGWOk9JTMqH26UwPDEmSJEmSpELY7NfFsp4UZ511FgDjx49vtZJInr59+1ZmH85aYhcsWNBqn8MOO2yhOTAkSZIkNY5XX3213iVIDc0GjC62++67A3DnnXcCsPTSS1eGd2TDOnbbbbfKawCDBw9m0KBBAGy44YYATJ06FYB11lkHKE3Q5RJLkiRJkqRm5RASSZIkSZKUPHtgdLEJEyYApV4VALfccgubb775p37OggULOOWUU4DqMqqrrLIKADfeeCOAvS8kSZIkSU3NHhiSJEmSJCl59sDoYiEEAPr16wfAJptsssh9P/jgAwD23ntv/vSnPwHVeTHGjRsHOGGnJEmSJElgDwxJkiRJktQA7IHRxdZff30AnnrqKQBGjRrFG2+8AcBmm20GVFcWGTNmDADPP/88w4YNA+BXv/oVwGLnzZAkSZIkqZnYgNHFnnvuOQB+8IMfAPDTn/6UTz75BID/+Z//abXvrrvuCsDPfvYzRowYUWCVkiRJkiQ1FoeQSJIkSZKk5NkDo5ucc845rT5KkiRJkqSOsweGJEmSJElKng0YkiRJkiQpeTZgSJIkSZKk5NmAIUmSJEmSkmcDhiRJkiRJSp4NGJIkSZIkKXk2YEiSJEmSpOTZgCFJkiRJkpJnA4YkSZIkSUqeDRiSJEmSJCl5IcZY3JuF8DrwL2BOYW/66fqTTi1QfD1rxRgHFPh+C0kwE9Dcuah7JsBctEHTnSsgyVyklAlowlwkmAlo7lzUPRNgLtqg6c4VkGQuUsoEeK5IRUq5SPJcUWgDBkAI4bEY49BC33QRUqoF0qunKKkdt/WkIbXjTqmelGopWkrHnlItkF49RUntuK0nDakdd0r1pFRL0VI69pRqgfTqKUpqx51SPSnV0pJDSCRJkiRJUvJswJAkSZIkScmrRwPGZXV4z0VJqRZIr56ipHbc1pOG1I47pXpSqqVoKR17SrVAevUUJbXjtp40pHbcKdWTUi1FS+nYU6oF0qunKKkdd0r1pFRLReFzYEiSJEmSJLWXQ0gkSZIkSVLybMCQJEmSJEnJK6wBI4QwIoTwfAhhWgjh1KLet8X7rxFCuCeEMCWE8EwI4bjy9pVCCHeGEF4of1yxwJqWDCE8GUK4vfx87RDCxHItN4QQehdVS73UMxcpZqL8/ubCXNTWZCa8huTVZC48V+TV1dS58FyRW1NTZwLMxSJqMhdeQ/LqSj4XhTRghBCWBH4J7AgMAfYPIQwp4r1bWACcFGPcCNgKOLpcw6nAXTHG9YC7ys+LchwwpcXz84Gfl2t5Czi0wFoKl0AuUswEmAtzsTAz4TUkj7nwXJGnaXORQCYgzVw0bSbAXHwKc+E1JE/yuSiqB8YXgWkxxhdjjPOBccBuBb03ADHGWTHGJ8r/nkfpB7N6uY6ry7tdDexeRD0hhEHATsBvy88DsC1wU9G11FFdc5FaJsBclJmLFswE4DVkIeYC8FyxEHPhuaKWmQDMxULMBeA1ZCGNkouiGjBWB15u8XxGeVtdhBAGA5sDE4FVY4yzoBQkYJWCyrgIGA18Un6+MvB2jHFB+Xldv0cFSSYXiWQCzAWYi1pmIqFMgLlISDK5SCQTYC6SyQQkk4tmzwSYizzmIqFcJJIJaJBcFNWAEXK21WX91hDC8sDNwPExxrl1qmFn4LUY4+MtN+fs2tPXuE3imFPIRLkOc1GSxDGnkAszUZHMMZuLpCRxzClkolyHuUjoeFPIhZmoSOaYzUVSkjjmFDJRrqNhctGroPeZAazR4vkgYGZB710RQliKUkCuizHeUt48O4QwMMY4K4QwEHitgFK+AuwaQhgJLAP0pdTi1S+E0KvcylWX71HB6p6LhDIB5iJjLqrMREndMwHmIkF1z0VCmQBzAQlkApLKhZkoMRetmYuSuucioUxAA+WiqB4YjwLrlWcx7Q3sB4wv6L2ByhiescCUGOOFLV4aDxxS/vchwG3dXUuM8bQY46AY42BK34u7Y4zfAu4B9iqyljqray5SygSYixbMRZmZqPAa0oK5qPBc0YK5ADxXtGImKsxFC+aiwmtICw2VixhjIQ9gJDAV+AdwelHv2+L9t6bU5WUyMKn8GElpbM9dwAvljysVXNfXgNvL/14HeASYBvweWLro71Mdfi51y0WqmTAX5sJMpJUJc5Huw3OFuUgpEynnopkzYS7MRYq5SDUTjZCLUC5MkiRJkiQpWUUNIZEkSZIkSeowGzAkSZIkSVLybMCQJEmSJEnJswFDkiRJkiQlzwYMSZIkSZKUPBswJEmSJElS8mzAkCRJkiRJyfv/35/clezMcusAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1d6cc659518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(15,6))\n",
    "for i in range(24):\n",
    "    plt.subplot(3,8,i+1)\n",
    "    plt.imshow(255-X_extendend_train[i], cmap='gray', interpolation='none')\n",
    "    plt.title(\"Class {}\".format(y_train[i]))\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Simple Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:29.626612Z",
     "start_time": "2018-03-22T11:16:29.488124Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_8 (Dense)              (None, 128)               401536    \n",
      "_________________________________________________________________\n",
      "dropout_6 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_9 (Dense)              (None, 10)                1290      \n",
      "=================================================================\n",
      "Total params: 402,826\n",
      "Trainable params: 402,826\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = Sequential()\n",
    "\n",
    "model.add(Dense(128, activation='relu', input_shape=(3136,)))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(10, activation='softmax'))\n",
    "        \n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:59.743208Z",
     "start_time": "2018-03-22T11:16:29.627801Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/10\n",
      "60000/60000 [==============================] - 11s 177us/step - loss: 14.2283 - acc: 0.1141 - val_loss: 14.2498 - val_acc: 0.1146\n",
      "Epoch 2/10\n",
      "60000/60000 [==============================] - 9s 147us/step - loss: 14.0690 - acc: 0.1248 - val_loss: 13.8900 - val_acc: 0.1363\n",
      "Epoch 3/10\n",
      "60000/60000 [==============================] - 9s 149us/step - loss: 14.0078 - acc: 0.1292 - val_loss: 14.1713 - val_acc: 0.1200\n",
      "Epoch 4/10\n",
      "60000/60000 [==============================] - 9s 151us/step - loss: 13.9243 - acc: 0.1349 - val_loss: 13.8727 - val_acc: 0.1382\n",
      "Epoch 5/10\n",
      "60000/60000 [==============================] - 9s 152us/step - loss: 13.8569 - acc: 0.1393 - val_loss: 13.7519 - val_acc: 0.1463\n",
      "Epoch 6/10\n",
      "60000/60000 [==============================] - 9s 154us/step - loss: 13.7816 - acc: 0.1442 - val_loss: 13.7431 - val_acc: 0.1468\n",
      "Epoch 7/10\n",
      "60000/60000 [==============================] - 9s 156us/step - loss: 13.8239 - acc: 0.1418 - val_loss: 13.8757 - val_acc: 0.1383\n",
      "Epoch 8/10\n",
      "60000/60000 [==============================] - 9s 155us/step - loss: 13.7789 - acc: 0.1446 - val_loss: 13.6672 - val_acc: 0.1515\n",
      "Epoch 9/10\n",
      "60000/60000 [==============================] - 9s 155us/step - loss: 13.7375 - acc: 0.1472 - val_loss: 13.6377 - val_acc: 0.1531\n",
      "Epoch 10/10\n",
      "60000/60000 [==============================] - 10s 161us/step - loss: 13.6832 - acc: 0.1503 - val_loss: 13.5794 - val_acc: 0.1567\n"
     ]
    }
   ],
   "source": [
    "model.fit(X_train_flat_extended, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat_extended, Y_test));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Deeper Network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:16:59.895748Z",
     "start_time": "2018-03-22T11:16:59.745281Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_10 (Dense)             (None, 128)               401536    \n",
      "_________________________________________________________________\n",
      "dropout_7 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_11 (Dense)             (None, 64)                8256      \n",
      "_________________________________________________________________\n",
      "dropout_8 (Dropout)          (None, 64)                0         \n",
      "_________________________________________________________________\n",
      "dense_12 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 410,442\n",
      "Trainable params: 410,442\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = Sequential()\n",
    "model.add(Dense(128, activation='relu', input_shape=(3136,)))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(64, activation='relu'))\n",
    "model.add(Dropout(0.5))\n",
    "model.add(Dense(10, activation='softmax'))\n",
    "\n",
    "model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:17:33.465627Z",
     "start_time": "2018-03-22T11:16:59.897862Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/10\n",
      "60000/60000 [==============================] - 10s 166us/step - loss: 14.2801 - acc: 0.1077 - val_loss: 14.2516 - val_acc: 0.1149\n",
      "Epoch 2/10\n",
      "60000/60000 [==============================] - 10s 159us/step - loss: 14.2509 - acc: 0.1141 - val_loss: 14.2152 - val_acc: 0.1177\n",
      "Epoch 3/10\n",
      "60000/60000 [==============================] - 10s 161us/step - loss: 14.2098 - acc: 0.1173 - val_loss: 14.2622 - val_acc: 0.1150\n",
      "Epoch 4/10\n",
      "60000/60000 [==============================] - 10s 166us/step - loss: 14.1982 - acc: 0.1182 - val_loss: 14.0263 - val_acc: 0.1290\n",
      "Epoch 5/10\n",
      "60000/60000 [==============================] - 10s 165us/step - loss: 14.1795 - acc: 0.1188 - val_loss: 14.1258 - val_acc: 0.1224\n",
      "Epoch 6/10\n",
      "60000/60000 [==============================] - 10s 168us/step - loss: 14.2043 - acc: 0.1176 - val_loss: 14.0765 - val_acc: 0.1262\n",
      "Epoch 7/10\n",
      "60000/60000 [==============================] - 10s 160us/step - loss: 14.1952 - acc: 0.1186 - val_loss: 14.1367 - val_acc: 0.1228\n",
      "Epoch 8/10\n",
      "60000/60000 [==============================] - 10s 161us/step - loss: 14.2147 - acc: 0.1178 - val_loss: 14.2863 - val_acc: 0.1136\n",
      "Epoch 9/10\n",
      "60000/60000 [==============================] - 10s 172us/step - loss: 14.2605 - acc: 0.1151 - val_loss: 14.2581 - val_acc: 0.1154\n",
      "Epoch 10/10\n",
      "60000/60000 [==============================] - 10s 164us/step - loss: 14.2523 - acc: 0.1157 - val_loss: 14.2468 - val_acc: 0.1161\n"
     ]
    }
   ],
   "source": [
    "model.fit(X_train_flat_extended, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_flat_extended, Y_test));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Now with a convolutional neural network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:17:33.658113Z",
     "start_time": "2018-03-22T11:17:33.467129Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "conv2d_3 (Conv2D)            (None, 54, 54, 8)         80        \n",
      "_________________________________________________________________\n",
      "max_pooling2d_3 (MaxPooling2 (None, 27, 27, 8)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 25, 25, 16)        1168      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_4 (MaxPooling2 (None, 12, 12, 16)        0         \n",
      "_________________________________________________________________\n",
      "dropout_9 (Dropout)          (None, 12, 12, 16)        0         \n",
      "_________________________________________________________________\n",
      "flatten_2 (Flatten)          (None, 2304)              0         \n",
      "_________________________________________________________________\n",
      "dense_13 (Dense)             (None, 64)                147520    \n",
      "_________________________________________________________________\n",
      "dropout_10 (Dropout)         (None, 64)                0         \n",
      "_________________________________________________________________\n",
      "dense_14 (Dense)             (None, 10)                650       \n",
      "=================================================================\n",
      "Total params: 149,418\n",
      "Trainable params: 149,418\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "cnn = Sequential()\n",
    "cnn.add(Convolution2D(8, kernel_size=(3, 3), activation='relu', input_shape=(56,56,1)))\n",
    "cnn.add(MaxPooling2D(pool_size=(2,2)))\n",
    "cnn.add(Convolution2D(16, (3, 3), activation='relu'))\n",
    "cnn.add(MaxPooling2D(pool_size=(2,2)))\n",
    "cnn.add(Dropout(0.5))\n",
    " \n",
    "cnn.add(Flatten())\n",
    "cnn.add(Dense(64, activation='relu'))\n",
    "cnn.add(Dropout(0.5))\n",
    "cnn.add(Dense(10, activation='softmax'))\n",
    "\n",
    "cnn.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
    "cnn.summary()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2018-03-22T11:18:21.649245Z",
     "start_time": "2018-03-22T11:17:33.659443Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 60000 samples, validate on 10000 samples\n",
      "Epoch 1/10\n",
      "60000/60000 [==============================] - 79s 1ms/step - loss: 3.3026 - acc: 0.1048 - val_loss: 2.2640 - val_acc: 0.1188\n",
      "Epoch 2/10\n",
      "60000/60000 [==============================] - 78s 1ms/step - loss: 2.1973 - acc: 0.1704 - val_loss: 1.9590 - val_acc: 0.3113\n",
      "Epoch 3/10\n",
      "60000/60000 [==============================] - 78s 1ms/step - loss: 1.8824 - acc: 0.2931 - val_loss: 1.3787 - val_acc: 0.5325\n",
      "Epoch 4/10\n",
      "60000/60000 [==============================] - 85s 1ms/step - loss: 1.5292 - acc: 0.4279 - val_loss: 0.9976 - val_acc: 0.7090\n",
      "Epoch 5/10\n",
      "60000/60000 [==============================] - 82s 1ms/step - loss: 1.2829 - acc: 0.5319 - val_loss: 0.7603 - val_acc: 0.7767\n",
      "Epoch 6/10\n",
      "60000/60000 [==============================] - 83s 1ms/step - loss: 1.1279 - acc: 0.5937 - val_loss: 0.6538 - val_acc: 0.8103\n",
      "Epoch 7/10\n",
      "60000/60000 [==============================] - 90s 1ms/step - loss: 1.0276 - acc: 0.6382 - val_loss: 0.5654 - val_acc: 0.8590\n",
      "Epoch 8/10\n",
      "60000/60000 [==============================] - 84s 1ms/step - loss: 0.9383 - acc: 0.6781 - val_loss: 0.4818 - val_acc: 0.8926\n",
      "Epoch 9/10\n",
      "60000/60000 [==============================] - 89s 1ms/step - loss: 0.8600 - acc: 0.7109 - val_loss: 0.3954 - val_acc: 0.9056\n",
      "Epoch 10/10\n",
      "60000/60000 [==============================] - 87s 1ms/step - loss: 0.7847 - acc: 0.7400 - val_loss: 0.3412 - val_acc: 0.9209\n"
     ]
    }
   ],
   "source": [
    "cnn.fit(X_train_extended, Y_train, batch_size=128, epochs=10, verbose=1, validation_data=(X_test_extended, Y_test));"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Conclusion\n",
    "With a more difficult problem, only a convolutional neural network succeeds at identiying which object is in the image. In addition, it needs fewer number of parameters compared to non-convolutional approaches (e.g. only fully connected)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  },
  "toc": {
   "colors": {
    "hover_highlight": "#DAA520",
    "navigate_num": "#000000",
    "navigate_text": "#333333",
    "running_highlight": "#FF0000",
    "selected_highlight": "#FFD700",
    "sidebar_border": "#EEEEEE",
    "wrapper_background": "#FFFFFF"
   },
   "moveMenuLeft": true,
   "nav_menu": {
    "height": "12px",
    "width": "252px"
   },
   "navigate_menu": true,
   "number_sections": true,
   "sideBar": true,
   "threshold": 4,
   "toc_cell": false,
   "toc_section_display": "block",
   "toc_window_display": false,
   "widenNotebook": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
